<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class facturacion extends MY_Controller {
	
	/**
	 * Evita la validacion (enfocado cuando se usa ajax). Ver mas en privilegios_model
	 * @var unknown_type
	 */
	private $excepcion_privilegio = array('facturacion/get_folio/', 'facturacion/get_ordenest/',
			'facturacion/get_productos_ordenes/', 'facturacion/imprimir/', 'facturacion/metodo_pago/');
	
	public function _remap($method){
		$this->carabiner->css(array(
				array('libs/jquery-ui.css', 'screen'),
				array('libs/ui.notify.css', 'screen'),
				array('libs/jquery.treeview.css', 'screen'),
				array('base.css', 'screen')
		));
		$this->carabiner->js(array(
				array('libs/jquery.min.js'),
				array('libs/jquery-ui.js'),
				array('libs/jquery.notify.min.js'),
				array('libs/jquery.treeview.js'),
				array('general/alertas.js')
		));
		
		$this->load->model("empleados_model");
		if($this->empleados_model->checkSession()){
			$this->empleados_model->excepcion_privilegio = $this->excepcion_privilegio;
			$this->info_empleado = $this->empleados_model->getInfoEmpleado($_SESSION['id_empleado'], true);
			if($this->empleados_model->tienePrivilegioDe('', get_class($this).'/'.$method.'/')){
				$this->{$method}();
			}else
				redirect(base_url('panel/home?msg=1'));
		}else
			redirect(base_url('panel/home'));
	}
	
	private function index(){
		$this->carabiner->css(array(
				array('libs/jquery.msgbox.css','screen'),
				array('libs/jquery.superbox.css','screen'),
				array('general/forms.css','screen'),
				array('general/tables.css','screen')
			));
		
		$this->carabiner->js(array(
				array('libs/jquery.msgbox.min.js'),
				array('libs/jquery.superbox.js'),
				array('general/msgbox.js'),
				array('facturacion/listado.js')
			));
		
		$this->load->library('pagination');
		
		$params['info_empleado']	= $this->info_empleado['info'];
		$params['opcmenu_active']	= 'Ventas'; //activa la opcion del menu
		$params['seo']				= array('titulo' => 'Administrar Facturas');
		
		$this->load->model('facturacion_model');
		$params['fact'] = $this->facturacion_model->getFacturas();
		
		$params['series'] = $this->facturacion_model->getSeriesFolios(100);
		
		if(isset($_GET['msg']{0}))
			$params['frm_errors'] = $this->showMsgs($_GET['msg']);
		
		$this->load->view('panel/header',$params);
		$this->load->view('panel/general/menu',$params);
		$this->load->view('panel/facturacion/listado',$params);
		$this->load->view('panel/footer',$params);
	}
	
	/**
	 * Agrega una factura a la bd
	 */
	public function agregar(){
		$this->carabiner->css(array(
				array('libs/jquery.msgbox.css', 'screen'),
				array('libs/jquery.superbox.css','screen'),
				array('general/forms.css', 'screen'),
				array('general/tables.css', 'screen')
		));
		$this->carabiner->js(array(
				array('libs/jquery.msgbox.min.js'),
				array('libs/jquery.numeric.js'),
				array('libs/jquery.superbox.js'),
				array('general/msgbox.js'),
				array('general/util.js'),
				array('facturacion/frm_addmod.js')
		));
	
		$params['info_empleado'] 	= $this->info_empleado['info']; //info empleado
		$params['opcmenu_active'] 	= 'Ventas'; //activa la opcion del menu
		$params['seo'] 				= array('titulo' => 'Agregar factura');
		$params['pagar_ordent'] 	= false;
	
		if(isset($_GET['ordent']{0}))
			$this->asignaOrdenTrabajo($_GET['ordent']);
		if(isset($_GET['factura']{0}))
			$this->asignaFactura($_GET['factura']);
	
		$this->configAddModFactura();
		$this->load->model('facturacion_model');

		if($this->form_validation->run() == FALSE){
			$params['frm_errors'] = $this->showMsgs(2, preg_replace("[\n|\r|\n\r]", '', validation_errors()));
		}else{
			$respons = $this->facturacion_model->addFactura();
				
			if($respons[0]){
				$params['id_factura'] = $respons[2];
				if($respons[1] == 'pa'){
					$params['pagar_ordent'] = true;
				}/*else
					redirect(base_url('panel/facturacion/agregar/?'.String::getVarsLink(array('msg')).'&msg=4'));*/
			}
		}
		
		$params['series']	= $this->facturacion_model->getSeriesFolios(100);
		$params['fecha'] 	= date("Y-m-d");
		if($this->input->post('did_vendedor') != '')
			$params['folio'] = explode(';', $this->ordenes_trabajo_model->getFolioOrdent($this->input->post('did_vendedor')));
		$params['plazo_credito'] = 7;

		if(isset($_GET['msg']{0}))
			$params['frm_errors'] = $this->showMsgs($_GET['msg']);

		$this->load->view('panel/header', $params);
		$this->load->view('panel/general/menu', $params);
		$this->load->view('panel/facturacion/agregar', $params);
		$this->load->view('panel/footer');
	}
	private function asignaOrdenTrabajo($id_ordent){
		$this->load->model('ordenes_trabajo_model');
		$data = $this->ordenes_trabajo_model->getInfoOrdenTrabajo($id_ordent);
	
		$campos = array('cliente->nombre_fiscal' => 'dcliente', 'id_cliente' => 'did_cliente',
				'condicion_pago' => 'dcondicion_pago', 
				'cliente->dias_credito' => 'dplazo_credito', 'subtotal' => 'dtsubtotal',
				'importe_iva' => 'dtiva', 'total' => 'dttotal');
		foreach($campos as $key => $itm){
			$dd = explode("->", $key);
			if(count($dd) == 1)
				$_POST[$itm] = $data['info']->{$key};
			else
				$_POST[$itm] = $data['info']->{$dd[0]}->{$dd[1]};
		}
	
		$cliente = $data['info']->cliente; 
		$_POST['dcliente_rfc'] = $cliente->rfc;
	
		$info = ''; $info2 = '';
		$info .= $cliente->calle!=''? $cliente->calle: '';
		$info .= $cliente->no_exterior!=''? ' #'.$cliente->no_exterior: '';
		$info .= $cliente->no_interior!=''? '-'.$cliente->no_interior: '';
		$info .= $cliente->colonia!=''? ', '.$cliente->colonia: '';
		$info .= ($cliente->localidad!=''? ', '.$cliente->localidad: '');
	
		$info2 .= $cliente->municipio!=''? $cliente->municipio: '';
		$info2 .= $cliente->estado!=''? ', '.$cliente->estado: '';
		$info2 .= $cliente->cp!=''? ', CP: '.$cliente->cp: '';
		$_POST['dcliente_domici'] = $info;
		$_POST['dcliente_ciudad'] = $info2;
	
		$_POST['dfecha'] = date("Y-m-d");
	
		//Productos de la orden y id orden
		$_POST['dids_ordenest'][] = $id_ordent;
		$campos = array('id_producto' => 'dpid_producto', 'cantidad' => 'dpcantidad',
				'precio_unitario' => 'dpprecio_unitario', 'importe' => 'dpimporte',
				'taza_iva' => 'dptaza_iva', 'importe_iva' => 'dpimporte_iva',
				'codigo' => 'dpcodigo', 'nombre' => 'dpnombre');
		foreach($data['productos'] as $kkey => $p){
			foreach($campos as $key => $itm){
				$_POST[$itm][$kkey] = $p->{$key};
			}
		}
	}
	private function asignaFactura($id_factura){
		$this->load->model('facturacion_model');
		$data 		= $this->facturacion_model->getInfoFactura($id_factura);
	
		$campos = array('cliente->nombre_fiscal' => 'dcliente', 'id_cliente' => 'did_cliente',
				'condicion_pago' => 'dcondicion_pago', 
				'cliente->dias_credito' => 'dplazo_credito', 'subtotal' => 'dtsubtotal',
				'importe_iva' => 'dtiva', 'total' => 'dttotal',
				'metodo_pago' => 'dmetodo_pago', 'metodo_pago_digitos' => 'dmetodo_pago_digitos');
		foreach($campos as $key => $itm){
			$dd = explode("->", $key);
			if(count($dd) == 1)
				$_POST[$itm] = $data['info']->{$key};
			else
				$_POST[$itm] = $data['info']->{$dd[0]}->{$dd[1]};
		}
	
		$cliente = $data['info']->cliente; 
		$_POST['dcliente_rfc'] = $cliente->rfc;
	
		$info = ''; $info2 = '';
		$info .= $cliente->calle!=''? $cliente->calle: '';
		$info .= $cliente->no_exterior!=''? ' #'.$cliente->no_exterior: '';
		$info .= $cliente->no_interior!=''? '-'.$cliente->no_interior: '';
		$info .= $cliente->colonia!=''? ', '.$cliente->colonia: '';
		$info .= ($cliente->localidad!=''? ', '.$cliente->localidad: '');
	
		$info2 .= $cliente->municipio!=''? $cliente->municipio: '';
		$info2 .= $cliente->estado!=''? ', '.$cliente->estado: '';
		$info2 .= $cliente->cp!=''? ', CP: '.$cliente->cp: '';
		$_POST['dcliente_domici'] = $info;
		$_POST['dcliente_ciudad'] = $info2;
	
		$_POST['dfecha'] = date("Y-m-d");
	
		//Productos de la orden y id ordens
		foreach ($data['ordenest'] as $key => $value) {
			$_POST['dids_ordenest'][] = $value->id_ordent;
		}
		$campos = array('id_producto' => 'dpid_producto', 'cantidad' => 'dpcantidad',
				'precio_unitario' => 'dpprecio_unitario', 'importe' => 'dpimporte',
				'taza_iva' => 'dptaza_iva', 'importe_iva' => 'dpimporte_iva',
				'codigo' => 'dpcodigo', 'nombre' => 'dpnombre');
		foreach($data['productos'] as $kkey => $p){
			foreach($campos as $key => $itm){
				$_POST[$itm][$kkey] = $p->{$key};
			}
		}
	}
	
	/**
	 * muesta la info de una factura sin dejar editar la info
	 */
	public function ver(){
		$this->carabiner->css(array(
				array('libs/jquery.msgbox.css', 'screen'),
				array('general/forms.css', 'screen'),
				array('general/tables.css', 'screen')
		));
		$this->carabiner->js(array(
				array('libs/jquery.msgbox.min.js'),
				array('libs/jquery.numeric.js'),
				array('general/msgbox.js'),
				array('general/util.js'),
				array('facturacion/frm_addmod.js')
		));
	
		$params['info_empleado'] = $this->info_empleado['info']; //info empleado
		$params['opcmenu_active'] = 'Ventas'; //activa la opcion del menu
		$params['seo'] = array('titulo' => 'Ver Factura');
	
		if(isset($_GET['id']{0})){
			/*$this->configAddModCotizacion();
			 	
			if($this->form_validation->run() == FALSE){
			$params['frm_errors'] = $this->showMsgs(2, preg_replace("[\n|\r|\n\r]", '', validation_errors()));
			}else{
			$respons = $this->empleados_model->updatePrivilegio();

			if($respons[0])
				redirect(base_url('panel/privilegios/modificar/?'.String::getVarsLink(array('msg')).'&msg=3'));
			}*/
			$this->load->model('facturacion_model');
			$params['series']	= $this->facturacion_model->getSeriesFolios(100);
			$params['inf'] 		= $this->facturacion_model->getInfoFactura($_GET['id']);
			if(!is_array($params['inf']))
				unset($params['inf']);
				
			if(isset($_GET['msg']{0}))
				$params['frm_errors'] = $this->showMsgs($_GET['msg']);
		}else
			$params['frm_errors'] = $this->showMsgs(1);

		$this->load->view('panel/header', $params);
		$this->load->view('panel/general/menu', $params);
		$this->load->view('panel/facturacion/ver', $params);
		$this->load->view('panel/footer');
	}
	
	/**
	 * Cancela una factura de la bd (le cambia el status a e:eliminada)
	 */
	public function cancelar(){
		if(isset($_GET['id']{0})){
			$this->load->model('facturacion_model');
			$respons = $this->facturacion_model->cancelaFactura();
			
			if(isset($_GET['cargaf'])){
				redirect(base_url('panel/facturacion/agregar/?factura='.$_GET['id']));
			}elseif($respons[0])
				redirect(base_url('panel/facturacion/?msg=5'));
		}else
			$params['frm_errors'] = $this->showMsgs(1);
	}

	/**
	 * Envia una factura por correo al cliente
	 * @return [type] [description]
	 */
	public function enviar(){
		if(isset($_GET['id']{0})){
			$this->load->model('facturacion_model');
			$respons = $this->facturacion_model->enviarFactura($_GET['id']);

			redirect(base_url('panel/facturacion/?msg='.$respons));
		}else
			$params['frm_errors'] = $this->showMsgs(1);
	}
	
	/**
	 * Actualiza el metodo de pago, el campo digitos
	 */
	public function metodo_pago(){
		if(isset($_POST['id_factura']{0}) && isset($_POST['mp_digitos']{0})){
			$this->load->model('facturacion_model');
			$respons = $this->facturacion_model->metodo_pago();
	
			$params = $this->showMsgs(8, 'Se actualizaron los digitos del metodo de pago.');
		}else
			$params = $this->showMsgs(1);
		
		echo json_encode($params);
	}
	
	/**
	 * Imprime la factura
	 */
	public function imprimir(){
		/*$result = $this->db->query("SELECT id_factura
		                           FROM facturas ORDER BY id_factura LIMIT 50 offset ".$_GET['offset']);
		foreach ($result->result() as $key => $value) {
			$_GET['id'] = $value->id_factura;*/
		if(isset($_GET['id']{0})){
			//factura
			$this->load->model('facturacion_model');
			$data = $this->facturacion_model->getInfoFactura($_GET['id']);
			
			$res = $this->db
				->select('*')
				->from('facturas_series_folios')
				->where("serie = '".$data['info']->serie."'")
			->get();
			$data_serie = $res->row();
			$res->free_result();
				
				
			$this->load->library('mypdf');
			// Creación del objeto de la clase heredada
			$pdf = new MYpdf('P', 'mm', 'Letter');
			$pdf->show_head = false;
			$pdf->AddPage();
				
			$pdf->Image(APPPATH.'images/factura.jpg', .5, 0, 215, 279);
				
			$y = 40;
			$pdf->SetXY(171, 15);
			$pdf->SetFont('Arial','B', 12);
			$pdf->SetTextColor(204, 0, 0);
			$pdf->Cell(35, 8, ($data['info']->serie!=''? $data['info']->serie.'-': '').$data['info']->folio, 0, 0, 'C');
				
				
			$pdf->SetXY(158, 40);
			$pdf->SetFont('Arial','', 10);
			$pdf->SetTextColor(0, 0, 0);
			$pdf->Cell(48, 6, $data['info']->fecha, 0, 0, 'C');
			/*$pdf->SetXY(182, 50);
			$pdf->Cell(25, 6, $data['info']->serie, 0, 0, 'C');*/
			$pdf->SetXY(158, 58);
			$pdf->Cell(48, 6, ($data['info']->condicion_pago=='cr'? 'CREDITO': 'CONTADO'), 0, 0, 'C');
				
			$pdf->SetXY(28, 38);
			$pdf->Cell(128, 6, $data['info']->cliente->nombre_fiscal, 0, 0, 'L');
			$pdf->SetFont('Arial','', 9);
			$pdf->SetXY(28, 45);
			$pdf->Cell(128, 6, $data['info']->domicilio, 0, 0, 'L');
			$pdf->SetXY(28, 52);
			$pdf->Cell(128, 6, $data['info']->ciudad, 0, 1, 'L');
			$pdf->SetXY(28, 58);
			$pdf->Cell(128, 6, strtoupper($data['info']->cliente->rfc), 0, 1, 'L');
				
			$pdf->SetY(70);
			$aligns = array('C', 'C', 'C', 'C', 'C');
			$widths = array(14, 18, 113, 24, 27);
			$header = array('Cantidad', 'Descripción', 'Precio', 'Importe');
			foreach($data['productos'] as $key => $item){
				$band_head = false;
				if($pdf->GetY() >= 200 || $key==0){ //salta de pagina si exede el max
					if($key > 0)
						$pdf->AddPage();
				}
					
				$pdf->SetFont('Arial','',8);
				$pdf->SetTextColor(0,0,0);
					
				$datos = array($item->cantidad, $item->unidad2,
						$item->nombre,
						String::formatoNumero($item->precio_unitario),
						String::formatoNumero($item->importe));
					
				$pdf->SetX(11);
				$pdf->SetAligns($aligns);
				$pdf->SetWidths($widths);
				$pdf->Row($datos, false, false);
			}
				
			$pdf->SetFont('Arial','', 8.5);
			$pdf->SetXY(180, 182);
			$pdf->Cell(27, 6, string::formatoNumero($data['info']->subtotal), 0, 0, 'L');
			$pdf->SetXY(180, 188);
			$pdf->Cell(27, 6, string::formatoNumero($data['info']->importe_iva), 0, 0, 'L');
			$pdf->SetXY(180, 194);
			$pdf->Cell(27, 6, string::formatoNumero($data['info']->retencion_iva), 0, 0, 'L');
			$pdf->SetXY(180, 200);
			$pdf->Cell(27, 6, string::formatoNumero($data['info']->total), 0, 0, 'L');
			$pdf->SetXY(51, 185);
			$pdf->SetAligns(array('L'));
			$pdf->SetWidths(array(105));
			$pdf->Row(array(strtoupper(string::num2letras($data['info']->total))), false, false);
			
			$pdf->Image(APPPATH.'images/series_folios/'.$data['info']->img_cbb, 11, 185, 34, 34);
			
			$pdf->SetFont('Arial','', 8);
			$pdf->SetXY(50, 206);
			$pdf->Cell(155, 6, $data_serie->leyenda1, 0, 0, 'L');
			$pdf->SetXY(50, 209);
			$pdf->SetAligns(array('L'));
			$pdf->SetWidths(array(155));
			$pdf->Row(array($data_serie->leyenda2.' '.$data['info']->ano_aprobacion), false, false);
			
			$pdf->SetXY(50, 197);
			$pdf->Cell(106, 6, $data['info']->forma_pago, 0, 0, 'L');
			$pdf->SetXY(50, 201);
			$pdf->Cell(106, 6, 'Metodo de pago:'.$data['info']->metodo_pago.', '.$data['info']->metodo_pago_digitos, 0, 0, 'L');
			
			$pdf->SetFont('Arial','', 10);
			$pdf->SetXY(50, 217);
			$pdf->Cell(155, 6, "Actividad empresarial y profesional regimen intermedio", 0, 0, 'L');	
			$pdf->SetXY(153, 217);
			$pdf->Cell(55, 6, "Número de aprobación: ".$data_serie->no_aprobacion, 0, 0, 'L');	

			$pdf->SetXY(170, 226);
			$pdf->SetFont('Arial','B', 12);
			$pdf->SetTextColor(204, 0, 0);
			$pdf->Cell(35, 8, ($data['info']->serie!=''? $data['info']->serie.'-': '').$data['info']->folio, 0, 0, 'C');
			
			if($data['info']->status == 'ca')
				$pdf->Image(APPPATH.'images/cancelado.png', 3, 9, 215, 270);
				
			/*$pdf->Output('facturas/'.$data['info']->cliente->nombre_fiscal.'-'.$data['info']->cliente->rfc.'-'.
				($data['info']->serie!=''? $data['info']->serie.'-': '').$data['info']->folio.'-'.$data['info']->status.'.pdf', 'F');*/
			$pdf->Output($data['info']->cliente->rfc.'-'.
				($data['info']->serie!=''? $data['info']->serie.'-': '').$data['info']->folio.'.pdf', 'I');
		}else
			$params['frm_errors'] = $this->showMsgs(1);
	}
	
	/**
	 * obtiene el folio siguiente de la serie seleccionada
	 */
	public function get_folio(){
		if(isset($_GET['serie']))
		{
			$this->load->model('facturacion_model');
			$res = $this->facturacion_model->getFolioSerie($_GET['serie']);
			
			$param =  $this->showMsgs(2, $res[1]);
			$param['data'] = $res[0];
			echo json_encode($param);
		}
	}
	
	/**
	 * Obtiene las ordenes de trabajo sin facturar, superbox
	 */
	public function get_ordenest(){
		$this->carabiner->css(array(
				array('libs/jquery.msgbox.css','screen'),
				array('general/forms.css','screen'),
				array('general/tables.css','screen')
		));
		
		$this->carabiner->js(array(
				array('libs/jquery.msgbox.min.js'),
				array('general/msgbox.js'),
				array('facturacion/listado.js')
		));
		
		$this->load->library('pagination');
		
		$params['seo'] 		= array('titulo' => 'Lista de ordenes de trabajo');
		
		$_GET['id_cliente'] = isset($_GET['id_cliente'])? $_GET['id_cliente']: '';
		
		$this->load->model('ordenes_trabajo_model');
		$params['orden'] 	= $this->ordenes_trabajo_model->getOrdenestSinFacturar(); //$_GET['id_cliente']);
		
		if(isset($_GET['msg']{0}))
			$params['frm_errors'] = $this->showMsgs($_GET['msg']);
		
		$this->load->view('panel/facturacion/listado_ordenest', $params);
	}
	
	/**
	 * Obtiene los productos de una o varias ordenes de trabajo 
	 * @param unknown_type $ordenes
	 */
	public function get_productos_ordenes($ordenes = NULL){
		$band = true;
		if($ordenes==NULL){
			$ordenes = $this->input->get('ordenes');
			$band = false;
		}
		$ids = "'".str_replace(',', "','", $ordenes)."'";
		
		$res = $this->db->query("
				SELECT op.id_ordent, p.id_producto, op.taza_iva, op.cantidad, op.precio_unitario, 
					op.importe, op.importe_iva, op.total, p.codigo, p.nombre
				FROM ordenest_productos AS op 
					INNER JOIN productos AS p ON p.id_producto = op.id_producto
				WHERE op.id_ordent IN (".$ids.")
				");
		if($band)
			return $res->result();
		else
			echo json_encode($res->result());
	}
	
	
	/**************** ABONOS ******************/
	/**
	 * Paga totalmente una factura o agrega abonos, y Agrega una operacion en bancos,
	 * se puede usar en superbox
	 */
	public function pagar(){
		$this->carabiner->css(array(
				array('general/forms.css', 'screen')
		));
		$this->carabiner->js(array(
				array('libs/jquery.numeric.js'),
				array('banco/estados_cuenta.js')
		));
	
		$params['seo'] 	= array('titulo' => 'Pagar Factura');
	
		//Config de pagar o abonar
		$msg_titulo 	= 'Pagar Factura!';
		$view 			= 'pagar_factura';
		$msg_ok 		= 'La Factura se pago correctamente.';
		if(isset($_GET['tipo']{0})){
			$params['seo']['titulo'] 	= 'Agregar abono';
			$msg_titulo 				= 'Agregar Abono!';
			$view 						= 'abonar_factura';
			$msg_ok 					= 'El abono se agrego correctamente.';
		}

		if(isset($_GET['id']{0})){
			$this->load->model('facturacion_model');
			$this->load->library('form_validation');
			$rules = array(
					array('field'	=> 'dfecha',
							'label'	=> 'Fecha',
							'rules'	=> 'required|max_length[10]|callback_isValidDate'),
					array('field'	=> 'dconcepto',
							'label'	=> 'Concepto',
							'rules'	=> 'required|max_length[120]'),
					array('field'	=> 'dmonto',
							'label'	=> 'Monto',
							'rules'	=> 'required|numeric'),
					array('field'	=> 'dcuenta',
							'label'	=> 'Cuenta',
							'rules'	=> 'required|max_length[25]'),
					array('field'	=> 'dtipo',
							'label'	=> 'Tipo',
							'rules'	=> 'required|max_length[2]'),
					array('field'	=> 'dactor',
							'label'	=> 'Proveedor',
							'rules'	=> 'required'),
					array('field'	=> 'did_actor',
							'label'	=> 'Proveedor',
							'rules'	=> 'required|max_length[25]'),
					array('field'	=> 'dforma_pago',
							'label'	=> 'Forma de pago',
							'rules'	=> ''));
			$this->form_validation->set_rules($rules);
			if($this->form_validation->run() == FALSE){
				$params['frm_errors'] = $this->showMsgs(2, preg_replace("[\n|\r|\n\r]", '', validation_errors()), $msg_titulo);
			}else{
				$respons = $this->facturacion_model->addAbono();

				if($respons[0]){
					$params['load_operaciones'] = true;
					$params['frm_errors'] = $this->showMsgs(8, $msg_ok, $msg_titulo);
				}
			}

			//Cuentas bancarias
			$this->load->model('banco_model');
			$params['cuentas'] = $this->banco_model->obtenCuentas(100);

			//Info factura
			$params['factura'] = $this->facturacion_model->getInfoFactura($_GET['id'], true);
			
			$this->load->model('clientes_model');
			$params['client'] = $this->clientes_model->getInfoCliente($params['factura']['info']->id_cliente, true);

			if(isset($_GET['msg']{0}))
				$params['frm_errors'] = $this->showMsgs($_GET['msg'], '', $msg_titulo);
		}else
			$params['frm_errors'] = $this->showMsgs(1);

		$this->load->view('panel/facturacion/'.$view, $params);
	}
	
	/**
	 * Elimina abonos de cobranza
	 */
	public function delete_abono(){
		if(isset($_GET['id']{0}) && isset($_GET['id_opc']{0})){
			$this->load->model('facturacion_model');
			$respons = $this->facturacion_model->deleteAbono($_GET['id'], $_GET['id_opc']);

			if($respons[0])
				redirect(base_url('panel/cobranza/detalle/?'.String::getVarsLink(array('id', 'msg')).'&msg=3'));
		}else
			$params['frm_errors'] = $this->showMsgs(1);
	}
	
	
	
	/**
	 * 					SERIES Y FOLIOS
	 * ************************************************
	 * 
	 * Permite administrar los series y folios para la facturacion
	 */
	public function series_folios(){
		$this->carabiner->css(array(
				array('general/forms.css','screen'),
				array('general/tables.css','screen')
		));
	
		$this->load->library('pagination');
		$this->load->model('facturacion_model');
	
		$params['info_empleado']	= $this->info_empleado['info'];
		$params['opcmenu_active']	= 'Ventas'; //activa la opcion del menu
		$params['seo']				= array('titulo' => 'Administrar Series y Folios');
	
		$params['datos_s'] = $this->facturacion_model->getSeriesFolios();
	
		$this->load->view('panel/header',$params);
		$this->load->view('panel/general/menu',$params);
		$this->load->view('panel/facturacion/series_folios/admin',$params);
		$this->load->view('panel/footer',$params);
	}
	
	public function agregar_serie_folio(){
		$this->carabiner->css(array(
				array('general/forms.css','screen'),
				array('general/tables.css','screen')
		));
		$this->carabiner->js(array(
				array('facturacion/series_folios/frm_addmod.js')
		));
				
		$params['info_empleado']	= $this->info_empleado['info'];
		$params['opcmenu_active'] 	= 'Ventas'; //activa la opcion del menu
		$params['seo']	= array('titulo' => 'Agregar Series y Folios');
		
		$this->load->model('facturacion_model');
		$this->configAddSerieFolio();

		if($this->form_validation->run() == FALSE)
		{
			$params['frm_errors']	= $this->showMsgs(2,preg_replace("[\n|\r|\n\r]", '', validation_errors()));
		}
		else
		{
			$model_resp	= $this->facturacion_model->addSerieFolio();
			if($model_resp[0])
				redirect(base_url('panel/facturacion/agregar_serie_folio/?'.String::getVarsLink(array('msg')).'&msg=6'));
			else
				$params['frm_errors'] = $this->showMsgs(2,$model_resp[1]);	
		}

		if(isset($_GET['msg']{0}))
				$params['frm_errors'] = $this->showMsgs($_GET['msg']);
		
		$this->load->view('panel/header',$params);
		$this->load->view('panel/general/menu',$params);
		$this->load->view('panel/facturacion/series_folios/agregar',$params);
		$this->load->view('panel/footer',$params);
	}
	
	public function modificar_serie_folio(){
		
		if(isset($_GET['id']{0})){
			$this->carabiner->css(array(
					array('general/forms.css','screen'),
					array('general/tables.css','screen')
			));
			$this->carabiner->js(array(
					array('facturacion/series_folios/frm_addmod.js')
			));
			
			$this->load->model('facturacion_model');
			$this->configAddSerieFolio('edit');
			
			if($this->form_validation->run() == FALSE)
			{
				$params['frm_errors']	= $this->showMsgs(2,preg_replace("[\n|\r|\n\r]", '', validation_errors()));
			}
			else
			{
				$model_resp	= $this->facturacion_model->editSerieFolio($_GET['id']);
				if($model_resp[0])
					$params['frm_errors']	= $this->showMsgs(7);
			}
			
			$params['info_empleado']	= $this->info_empleado['info'];
			$params['opcmenu_active'] 	= 'Ventas'; //activa la opcion del menu
			$params['seo']['titulo']	= 'Modificar Serie y Folio';
			
			$params['serie_info']	= $this->facturacion_model->getInfoSerieFolio($_GET['id']);
			
			if(isset($_GET['msg']{0}))
					$params['frm_errors'] = $this->showMsgs($_GET['msg']);
			
				$this->load->view('panel/header',$params);
				$this->load->view('panel/general/menu',$params);
				$this->load->view('panel/facturacion/series_folios/modificar',$params);
				$this->load->view('panel/footer',$params);
		}
		else
			redirect(base_url('panel/facturacion/index_serie_folios/').String::getVarsLink(array('msg')).'&msg=1');
	}
	
	
	
	/**
	 * Configura los metodos de agregar y modificar
	 */
	private function configAddModFactura(){
		$this->load->library('form_validation');
		$rules = array(
				array('field'		=> 'did_cliente',
						'label'		=> 'Cliente',
						'rules'		=> 'required|max_length[25]'),
				array('field'		=> 'dserie',
						'label'		=> 'Serie',
						'rules'		=> 'max_length[25]'),
				array('field'		=> 'dfolio',
						'label'		=> 'Folio',
						'rules'		=> 'required|numeric|callback_seriefolio_check'),
				array('field'		=> 'dno_aprobacion',
						'label'		=> 'Numero de aprobacion',
						'rules'		=> 'required|numeric'),
				array('field'		=> 'dano_aprobacion',
						'label'		=> 'Fecha de aprobacion',
						'rules'		=> 'required|max_length[10]|callback_isValidDate'),
				array('field'		=> 'dimg_cbb',
						'label'		=> 'Imagen CBB',
						'rules'		=> 'required|max_length[60]'),
				array('field'		=> 'dfecha',
						'label'		=> 'Fecha',
						'rules'		=> 'required|max_length[10]|callback_isValidDate'),
				array('field'		=> 'dtsubtotal',
						'label'		=> 'SubTotal',
						'rules'		=> 'required|numeric'),
				array('field'		=> 'dtiva',
						'label'		=> 'IVA',
						'rules'		=> 'required|numeric'),
				array('field'		=> 'dtretencion_iva',
						'label'		=> 'Retencion IVA',
						'rules'		=> 'required|numeric'),
				array('field'		=> 'dttotal',
						'label'		=> 'Total',
						'rules'		=> 'required|numeric|callback_val_total'),
				array('field'		=> 'dforma_pago',
						'label'		=> 'Forma de pago',
						'rules'		=> 'required|max_length[80]'),
				array('field'		=> 'dmetodo_pago',
						'label'		=> 'Metodo de pago',
						'rules'		=> 'required|max_length[40]'),
				array('field'		=> 'dmetodo_pago_digitos',
						'label'		=> 'Ultimos 4 digitos',
						'rules'		=> 'max_length[20]'),
				array('field'		=> 'dcondicion_pago',
						'label'		=> 'Condición de pago',
						'rules'		=> 'required|max_length[2]'),
				array('field'		=> 'dplazo_credito',
						'label'		=> 'Plazo de crédito',
						'rules'		=> 'required|numeric'),
					
				array('field'		=> 'dcliente',
						'label'		=> 'Cliente',
						'rules'		=> ''),
				array('field'		=> 'dcliente_rfc',
						'label'		=> 'Cliente',
						'rules'		=> ''),
				array('field'		=> 'dcliente_domici',
						'label'		=> 'Cliente',
						'rules'		=> ''),
				array('field'		=> 'dcliente_ciudad',
						'label'		=> 'Cliente',
						'rules'		=> ''),
				array('field'		=> 'dttotal_letra',
						'label'		=> 'letra',
						'rules'		=> ''),
				array('field'		=> 'dreten_iva',
						'label'		=> 'Retecion IVA',
						'rules'		=> ''),

				array('field'		=> 'demail',
						'label'		=> 'email',
						'rules'		=> '')
		);
		$this->form_validation->set_rules($rules);
	}
	
	private function configAddSerieFolio($tipo='add'){
		$this->load->library('form_validation');
	
		$rules = array(
// 						array('field'	=> 'fserie',
// 								'label'	=> 'Serie',
// 							  	'rules'	=> 'max_lenght[30]|callback_isValidSerie'),
						array('field'	=> 'fno_aprobacion',
								'label'	=> 'No Aprobación',
								'rules'	=> 'required|numeric'),
						array('field'	=> 'ffolio_inicio',
								'label'	=> 'Folio Inicio',
								'rules'	=> 'required|is_natural'),
						array('field'	=> 'ffolio_fin',
								'label'	=> 'Folio Fin',
								'rules'	=> 'required|is_natural'),
						array('field'	=> 'fano_aprobacion',
								'label'	=> 'Fecha Aprobación',
								'rules'	=> 'required|max_length[10]|callback_isValidDate'),
// 						array('field'	=> 'durl_img',
// 								'label'	=> 'Imagen',
// 								'rules'	=> 'required'),
						array('field'	=> 'fleyenda',
								'label'	=> 'Leyenda',
								'rules'	=> ''),
						array('field'	=> 'fleyenda1',
								'label'	=> 'Leyenda 1',
								'rules'	=> ''),
						array('field'	=> 'fleyenda2',
								'label'	=> 'Leyenda 2',
								'rules'	=> '')
				);
		
		if($tipo=='add'){
			if(isset($_FILES['durl_img']))
				if($_FILES['durl_img']['name']!='')
				$_POST['durl_img'] = 'ok';

			$rules[] = array('field'	=> 'fserie',
								'label'	=> 'Serie',
							  	'rules'	=> 'max_lenght[30]|callback_isValidSerie[add]');
			$rules[] = array('field'	=> 'durl_img',
					'label'	=> 'Imagen',
					'rules'	=> 'required');
		}
		
		if($tipo=='edit'){
			$rules[] = array('field'	=> 'fserie',
							'label'	=> 'Serie',
							'rules'	=> 'max_lenght[30]|callback_isValidSerie[edit]');
		}
		
		$this->form_validation->set_rules($rules);
	}
	
	/**
	 * Form_validation: Valida su una fecha esta en formato correcto
	 */
	public function isValidDate($str){
		if($str != ''){
			if(String::isValidDate($str) == false){
				$this->form_validation->set_message('isValidDate', 'El campo %s no es una fecha valida');
				return false;
			}
		}
		return true;
	}
	
	/**
	 * Form_validation: Valida su una fecha esta en formato correcto
	 */
	public function isValidYear($str){
		if($str != ''){
			$year = intval($str);
			if( $year<1000 || $year>2100){
				$this->form_validation->set_message('isValidYear', 'El campo %s no es un año valido');
				return false;
			}
		}
		return true;
	}
	
	
	/**
	 * Form_validation: Valida si la Serie ya existe
	 */
	public function isValidSerie($str, $tipo){
		$str = ($str=='') ? '' : $str;

		if($tipo=='add'){
			if($this->facturacion_model->exist('facturas_series_folios',array('serie' =>strtoupper($str)))){
				$this->form_validation->set_message('isValidSerie', 'El campo %s ya existe');
				return false;
			}
			return true;
		}
		else{
			$row = $this->facturacion_model->exist('facturas_series_folios',array('serie' =>strtoupper($str)),true);
			
			if($row!=FALSE){
				if($row->id_serie_folio == $_GET['id'])
					return true;
				else{
					$this->form_validation->set_message('isValidSerie', 'El campo %s ya existe');
					return false;
				}
			}return true;
		}
			
	}
	
	/**
	 * Form_validation: Valida si el usuario ya esta usado por alguien mas
	 * @param unknown_type $str
	 */
	public function seriefolio_check($str){
		if($str != ''){
			$sql = $ms = '';
			
			$res = $this->db->select('Count(id_factura) AS num')
				->from('facturas')
				->where("serie = '".$this->input->post('dserie')."' AND folio = ".$str."".$sql)
			->get();
			$data = $res->row();
			if($data->num > 0){
				$this->form_validation->set_message('seriefolio_check', 'El serie y folio ya esta utilizado por otra Factura.');
				return false;
			}
		}
		return true;
	}
	
	public function val_total($str){
		if($str <= 0){
			$this->form_validation->set_message('val_total', 'El Total no puede ser 0, verifica los datos ingresados.');
			return false;
		}
		return true;
	}
	
	/**
	 * Muestra mensajes cuando se realiza alguna accion
	 * @param unknown_type $tipo
	 * @param unknown_type $msg
	 * @param unknown_type $title
	 */
	private function showMsgs($tipo, $msg='', $title='Facturacion!'){
		switch($tipo){
			case 1:
				$txt = 'El campo ID es requerido.';
				$icono = 'error';
				break;
			case 2: //Cuendo se valida con form_validation
				$txt = $msg;
				$icono = 'error';
				break;
			case 3:
				$txt = 'La Factura se modifico correctamente.';
				$icono = 'ok';
				break;
			case 4:
				$txt = 'La Factura se agrego correctamente.';
				$icono = 'ok';
				break;
			case 5:
				$txt = 'La Factura se cancelo correctamente.';
				$icono = 'ok';
				break;
			case 6:
				$txt = 'La Serie y Folio se agregaron correctamente.';
				$icono = 'ok';
				break;
			case 7:
				$txt = 'La Serie y Folio se modifico correctamente.';
				$icono = 'ok';
				break;
			case 8:
				$txt = $msg;
				$icono = 'ok';
				break;
			case 9:
				$txt = 'Se envío la factura correctamente.';
				$icono = 'ok';
				break;
			case 10:
				$txt = 'Ocurrio un error al enviar la factura, intente de nuevo.';
				$icono = 'error';
				break;
			case 11:
				$txt = 'No tiene registrado un Email el cliente.';
				$icono = 'error';
				break;
		}
	
		return array(
				'title' => $title,
				'msg' => $txt,
				'ico' => $icono);
	}	
}